home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / PROGRAMR / OLE2BOOK.ZIP / CHAP11.ZIP / CHAP11 / POLYLINE / POLYLINE.CPP < prev    next >
C/C++ Source or Header  |  1993-06-22  |  17KB  |  736 lines

  1. /*
  2.  * POLYLINE.CPP
  3.  * Polyline Component Object Chapter 11
  4.  *
  5.  * Implementation of the CPolyline class that we expose as an
  6.  * OLE 2.0 component object.
  7.  *
  8.  * Copyright (c)1993 Microsoft Corporation, All Rights Reserved
  9.  *
  10.  * Kraig Brockschmidt, Software Design Engineer
  11.  * Microsoft Systems Developer Relations
  12.  *
  13.  * Internet  :  kraigb@microsoft.com
  14.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  15.  */
  16.  
  17.  
  18. #include "polyline.h"
  19.  
  20.  
  21. /*
  22.  * CPolyline:CPolyline
  23.  * CPolyline::~CPolyline
  24.  *
  25.  * Constructor Parameters:
  26.  *  punkOuter       LPUNKNOWN of the controlling unknown.
  27.  *  pfnDestroy      LPFNDESTROYED to call when an object is destroyed.
  28.  *  hInst           HINSTANCE of the application we're in.
  29.  */
  30.  
  31. CPolyline::CPolyline(LPUNKNOWN punkOuter, LPFNDESTROYED pfnDestroy
  32.     , HINSTANCE hInst)
  33.     {
  34.     m_hWnd=NULL;
  35.     m_hInst=hInst;
  36.  
  37.     m_cRef=0;
  38.     m_punkOuter=punkOuter;
  39.     m_pfnDestroy=pfnDestroy;
  40.     m_fDirty=FALSE;
  41.  
  42.     m_pST=NULL;
  43.     m_cf =0;
  44.  
  45.     m_clsID=CLSID_Polyline11;
  46.     m_iID  =IID_IPolyline6;
  47.  
  48.     //NULL any contained interfaces initially.
  49.     m_pIPolyline        =NULL;
  50.     m_pIPersistStorage  =NULL;
  51.  
  52.     m_pIDataObject      =NULL;
  53.     m_pIDataAdviseHolder=NULL;
  54.     m_pAdv              =NULL;
  55.  
  56.     //Initialize IDataObject::EnumFormatEtc arrays
  57.     m_cf=RegisterClipboardFormat(SZPOLYLINECLIPFORMAT);
  58.  
  59.     //CHAPTER11MOD
  60.     m_pDefIUnknown       =NULL;
  61.     m_pDefIOleObject     =NULL;
  62.     m_pDefIDataObject    =NULL;
  63.     m_pDefIViewObject    =NULL;
  64.     m_pDefIPersistStorage=NULL;
  65.  
  66.     m_pIOleAdviseHolder =NULL;
  67.     m_pIOleObject       =NULL;
  68.     m_pIOleClientSite   =NULL;
  69.     m_pIViewObject      =NULL;
  70.     m_pIAdviseSink      =NULL;
  71.  
  72.     m_dwFrozenAspects   =0;
  73.     m_dwAdviseAspects   =0;
  74.     m_dwAdviseFlags     =0;
  75.  
  76.     m_hDlg=NULL;
  77.     //End CHAPTER11MOD
  78.  
  79.     return;
  80.     }
  81.  
  82.  
  83. CPolyline::~CPolyline(void)
  84.     {
  85.     if (NULL!=m_pST)
  86.         delete m_pST;
  87.  
  88.     //CHAPTER11MOD
  89.     if (NULL!=m_hDlg)
  90.         DestroyWindow(m_hDlg);
  91.  
  92.     if (NULL!=m_pDefIUnknown)
  93.         m_pDefIUnknown->Release();
  94.  
  95.     if (NULL!=m_pDefIOleObject)
  96.         m_pDefIOleObject->Release();
  97.  
  98.     if (NULL!=m_pDefIViewObject)
  99.         m_pDefIViewObject->Release();
  100.  
  101.     if (NULL!=m_pDefIDataObject)
  102.         m_pDefIDataObject->Release();
  103.  
  104.     if (NULL!=m_pDefIPersistStorage)
  105.         m_pDefIPersistStorage->Release();
  106.  
  107.     if (NULL!=m_pIAdviseSink)
  108.         m_pIAdviseSink->Release();
  109.  
  110.     if (NULL!=m_pIViewObject)
  111.         delete m_pIViewObject;
  112.  
  113.     if (NULL!=m_pIOleClientSite)
  114.         m_pIOleClientSite->Release();
  115.  
  116.     if (NULL!=m_pIOleAdviseHolder)
  117.         m_pIOleAdviseHolder->Release();
  118.  
  119.     if (NULL!=m_pIOleObject)
  120.         delete m_pIOleObject;
  121.     //End CHAPTER11MOD
  122.  
  123.  
  124.     //Free our contained interfaces, delete those we own, Release others.
  125.     if (NULL!=m_pIDataAdviseHolder)
  126.         m_pIDataAdviseHolder->Release();
  127.  
  128.     if (NULL!=m_pIDataObject)
  129.         delete m_pIDataObject;
  130.  
  131.     if (NULL!=m_pIPersistStorage)
  132.         delete m_pIPersistStorage;
  133.  
  134.     if (NULL!=m_pIPolyline)
  135.         delete m_pIPolyline;
  136.  
  137.     //Reverses the AddRef in ::SetAdvise
  138.     if (NULL!=m_pAdv)
  139.         m_pAdv->Release();
  140.  
  141.     return;
  142.     }
  143.  
  144.  
  145.  
  146.  
  147. /*
  148.  * CPolyline::FInit
  149.  *
  150.  * Purpose:
  151.  *  Performs any intiailization of a CPolyline that's prone to failure
  152.  *  that we also use internally before exposing the object outside
  153.  *  this DLL.
  154.  *
  155.  * Parameters:
  156.  *  None
  157.  *
  158.  * Return Value:
  159.  *  BOOL            TRUE if the function is successful, FALSE otherwise.
  160.  */
  161.  
  162. BOOL CPolyline::FInit(void)
  163.     {
  164.     LPUNKNOWN       pIUnknown=(LPUNKNOWN)this;
  165.     HRESULT         hr;
  166.  
  167.     if (NULL!=m_punkOuter)
  168.         pIUnknown=m_punkOuter;
  169.  
  170.     m_pST=new CStringTable(m_hInst);
  171.  
  172.     if (!m_pST->FInit(IDS_POLYLINEMIN, IDS_POLYLINEMAX))
  173.         return FALSE;
  174.  
  175.     //Allocate contained interfaces.
  176.     m_pIPolyline=new CImpIPolyline(this, pIUnknown);
  177.  
  178.     if (NULL==m_pIPolyline)
  179.         return FALSE;
  180.  
  181.     m_pIPersistStorage=new CImpIPersistStorage(this, pIUnknown);
  182.  
  183.     if (NULL==m_pIPersistStorage)
  184.         return FALSE;
  185.  
  186.     m_pIDataObject=new CImpIDataObject(this, pIUnknown);
  187.  
  188.     if (NULL==m_pIDataObject)
  189.         return FALSE;
  190.  
  191.     //CHAPTER11MOD
  192.     m_pIOleObject=new CImpIOleObject(this, pIUnknown);
  193.  
  194.     if (NULL==m_pIOleObject)
  195.         return FALSE;
  196.  
  197.     m_pIViewObject=new CImpIViewObject(this, pIUnknown);
  198.  
  199.     if (NULL==m_pIViewObject)
  200.         return FALSE;
  201.  
  202.  
  203.     //Get stuff from the default handler so we get some free implementation
  204.     hr=OleCreateDefaultHandler(CLSID_Polyline11, pIUnknown, IID_IUnknown
  205.         , (LPLPVOID)&m_pDefIUnknown);
  206.  
  207.     if (FAILED(hr))
  208.         return FALSE;
  209.  
  210.     //Now try to get other interfaces to which we delegate
  211.     hr=m_pDefIUnknown->QueryInterface(IID_IOleObject
  212.         , (LPLPVOID)&m_pDefIOleObject);
  213.  
  214.     if (FAILED(hr))
  215.         return FALSE;
  216.  
  217.     hr=m_pDefIUnknown->QueryInterface(IID_IViewObject
  218.         , (LPLPVOID)&m_pDefIViewObject);
  219.  
  220.     if (FAILED(hr))
  221.         return FALSE;
  222.  
  223.     hr=m_pDefIUnknown->QueryInterface(IID_IDataObject
  224.         , (LPLPVOID)&m_pDefIDataObject);
  225.  
  226.     if (FAILED(hr))
  227.         return FALSE;
  228.  
  229.     hr=m_pDefIUnknown->QueryInterface(IID_IPersistStorage
  230.         , (LPLPVOID)&m_pDefIPersistStorage);
  231.  
  232.     if (FAILED(hr))
  233.         return FALSE;
  234.  
  235.     m_pIPolyline->New();
  236.     //End CHAPTER11MOD
  237.  
  238.     return TRUE;
  239.     }
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247. /*
  248.  * CPolyline::QueryInterface
  249.  * CPolyline::AddRef
  250.  * CPolyline::Release
  251.  *
  252.  * Purpose:
  253.  *  IUnknown members for CPolyline object.
  254.  */
  255.  
  256. STDMETHODIMP CPolyline::QueryInterface(REFIID riid, LPVOID FAR *ppv)
  257.     {
  258.     *ppv=NULL;
  259.  
  260.     /*
  261.      * The only calls we get here for IUnknown are either in a non-aggregated
  262.      * case or when we're created in an aggregation, so in either we always
  263.      * return our IUnknown for IID_IUnknown.
  264.      */
  265.     if (IsEqualIID(riid, IID_IUnknown))
  266.         *ppv=(LPVOID)this;
  267.  
  268.     //For anything else we return contained interfaces.
  269.     if (IsEqualIID(riid, m_iID))
  270.         *ppv=(LPVOID)m_pIPolyline;
  271.  
  272.     if (IsEqualIID(riid, IID_IPersist) || IsEqualIID(riid, IID_IPersistStorage))
  273.         *ppv=(LPVOID)m_pIPersistStorage;
  274.  
  275.     if (IsEqualIID(riid, IID_IDataObject))
  276.         *ppv=(LPVOID)m_pIDataObject;
  277.  
  278.     //CHAPTER11MOD
  279.     if (IsEqualIID(riid, IID_IOleObject))
  280.         *ppv=(LPVOID)m_pIOleObject;
  281.  
  282.     if (IsEqualIID(riid, IID_IViewObject))
  283.         *ppv=(LPVOID)m_pIViewObject;
  284.  
  285.     //Use the default handler's cache.
  286.     if (IsEqualIID(riid, IID_IOleCache))
  287.         return m_pDefIUnknown->QueryInterface(riid, ppv);
  288.     //End CHAPTER11MOD
  289.  
  290.     //AddRef any interface we'll return.
  291.     if (NULL!=*ppv)
  292.         {
  293.         ((LPUNKNOWN)*ppv)->AddRef();
  294.         return NOERROR;
  295.         }
  296.  
  297.     return ResultFromScode(E_NOINTERFACE);
  298.     }
  299.  
  300.  
  301. STDMETHODIMP_(ULONG) CPolyline::AddRef(void)
  302.     {
  303.     return ++m_cRef;
  304.     }
  305.  
  306.  
  307. STDMETHODIMP_(ULONG) CPolyline::Release(void)
  308.     {
  309.     ULONG       cRefT;
  310.  
  311.     cRefT=--m_cRef;
  312.  
  313.     if (0==m_cRef)
  314.         delete this;
  315.  
  316.     return cRefT;
  317.     }
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325. /*
  326.  * CPolyline::RectConvertMappings
  327.  *
  328.  * Purpose:
  329.  *  Converts the contents of a rectangle from device (MM_TEXT) or
  330.  *  HIMETRIC to the other.
  331.  *
  332.  * Parameters:
  333.  *  pRect           LPRECT containing the rectangle to convert.
  334.  *  fToDevice       BOOL TRUE to convert from HIMETRIC to device,
  335.  *                  FALSE to convert device to HIMETRIC.
  336.  *
  337.  * Return Value:
  338.  *  None
  339.  */
  340.  
  341. void CPolyline::RectConvertMappings(LPRECT pRect, BOOL fToDevice)
  342.     {
  343.     HDC      hDC;
  344.     int      iLpx, iLpy;
  345.  
  346.     if (NULL==pRect)
  347.         return;
  348.  
  349.     hDC=GetDC(NULL);
  350.     iLpx=GetDeviceCaps(hDC, LOGPIXELSX);
  351.     iLpy=GetDeviceCaps(hDC, LOGPIXELSY);
  352.     ReleaseDC(NULL, hDC);
  353.  
  354.     if (fToDevice)
  355.         {
  356.         pRect->left=MulDiv(iLpx, pRect->left, HIMETRIC_PER_INCH);
  357.         pRect->top =MulDiv(iLpy, pRect->top , HIMETRIC_PER_INCH);
  358.  
  359.         pRect->right =MulDiv(iLpx, pRect->right,  HIMETRIC_PER_INCH);
  360.         pRect->bottom=MulDiv(